package com.IC.base.service.impl;

import com.IC.base.mapper.ActualTenementMapper;
import com.IC.base.service.ActualTenementService;
import com.IC.domain.dto.ActualTenementDTO;
import com.IC.domain.po.ActualPopulationPo;
import com.IC.domain.vo.ActualTenementVO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.IC.domain.po.ActualTenementPO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class ActualTenementServiceImpl extends ServiceImpl<ActualTenementMapper, ActualTenementPO> implements ActualTenementService {

    @Autowired
    private ActualTenementMapper actualTenementMapper;

    @Autowired
    private KafkaTemplate<Object, Object> kafkaTemplate;

    @Override
    public List<ActualTenementPO> findByPlotId(Long id) {
        List<ActualTenementPO> actualTenementPOList = actualTenementMapper.findByPlotId(id);
        return actualTenementPOList;
    }

    @Override
    public List<ActualTenementPO> findById(Long id) {
        List<ActualTenementPO> actualTenementPOList = actualTenementMapper.findById(id);
        return actualTenementPOList;
    }

    @Override
    public List<ActualTenementVO> findByPlotIdList(Long id) {
        List<ActualTenementVO> byPlotIdList = actualTenementMapper.findByPlotIdList(id);
        return byPlotIdList;
    }

    @Override
    public void add(ActualTenementDTO actualTenementDTO) {
        ActualTenementPO actualTenementPO = new ActualTenementPO();

        Integer buildingId = actualTenementDTO.getBuildingId();
        actualTenementPO.setName(buildingId+"栋");
        actualTenementPO.setPlotId(actualTenementDTO.getPlotId());
        //判断该小区是否存在该楼栋
        ActualTenementPO actualTenementPO3 = actualTenementMapper.selectByBuildingId(actualTenementPO);
        //该楼栋不存在
        if(actualTenementPO3==null){
            //添加栋信息
            actualTenementMapper.add(actualTenementPO);

            //添加单元信息
            ActualTenementPO actualTenementPO1 = new ActualTenementPO();
            actualTenementPO1.setPlotId(actualTenementDTO.getPlotId());
            actualTenementPO1.setName(actualTenementDTO.getUnitId()+"单元");
            actualTenementPO1.setParentId(actualTenementPO.getId());
            actualTenementMapper.addUnit(actualTenementPO1);
            //添加房间号信息

            for (int i = actualTenementDTO.getStartFloor(); i <= actualTenementDTO.getEndFloor(); i++) {
                for (int j = actualTenementDTO.getStartNumber(); j <= actualTenementDTO.getEndNumber(); j++) {
                    ActualTenementPO actualTenementPO2 = new ActualTenementPO();
                    if(j<10&&j>0){
                        actualTenementPO2.setName(i+"0"+j);
                    }
                    if(j>=10){
                        actualTenementPO2.setName(i+" "+j);
                    }
                    actualTenementPO2.setPlotId(actualTenementDTO.getPlotId());
                    actualTenementPO2.setParentId(actualTenementPO1.getId());
                    actualTenementMapper.addRoom(actualTenementPO2);
                }
            }
        }
        //该楼栋存在
        else {
            ActualTenementPO actualTenementPO1 = new ActualTenementPO();
            //判断该楼栋是否存在单元
            actualTenementPO1.setPlotId(actualTenementDTO.getPlotId());
            actualTenementPO1.setName(actualTenementDTO.getUnitId()+"单元");
            actualTenementPO1.setParentId(actualTenementPO3.getId());
            ActualTenementPO byUnitId = actualTenementMapper.findByUnitId(actualTenementPO1);
            if(byUnitId==null){
                //添加单元信息
                actualTenementMapper.addUnit(actualTenementPO1);
                //添加房间号信息
                for (int i = actualTenementDTO.getStartFloor(); i <= actualTenementDTO.getEndFloor(); i++) {
                    for (int j = actualTenementDTO.getStartNumber(); j <= actualTenementDTO.getEndNumber(); j++) {
                        ActualTenementPO actualTenementPO2 = new ActualTenementPO();
                        if(j<10&&j>0){
                            actualTenementPO2.setName(i+"0"+j);
                        }
                        if(j>=10){
                            actualTenementPO2.setName(i+" "+j);
                        }
                        actualTenementPO2.setPlotId(actualTenementDTO.getPlotId());
                        actualTenementPO2.setParentId(actualTenementPO1.getId());
                        actualTenementMapper.addRoom(actualTenementPO2);
                    }
                }
            }
            else {
                //判断该单元是否存在房间
                //添加房间号信息
                for (int i = actualTenementDTO.getStartFloor(); i <= actualTenementDTO.getEndFloor(); i++) {
                    for (int j = actualTenementDTO.getStartNumber(); j <= actualTenementDTO.getEndNumber(); j++) {
                        ActualTenementPO actualTenementPO2 = new ActualTenementPO();
                        if(j<10&&j>0){
                            actualTenementPO2.setName(i+"0"+j);
                        }
                        if(j>=10){
                            actualTenementPO2.setName(i+" "+j);
                        }
                        actualTenementPO2.setPlotId(actualTenementDTO.getPlotId());
                        actualTenementPO2.setParentId(byUnitId.getId());
                        ActualTenementPO actualTenementPO4 = actualTenementMapper.selectByRoomId(actualTenementPO2);
                        if(actualTenementPO4==null){
                            actualTenementMapper.addRoom(actualTenementPO2);
                        }
                    }
                }
            }
        }
    }

    @Override
    public void addPopulation(ActualTenementVO actualTenementPO) {

        // 验证actualTenementPO的有效性
        if (actualTenementPO == null) {
            throw new IllegalArgumentException("实际房产信息对象不能为空");
        }

        // 创建实际人口信息对象
        ActualPopulationPo actualPopulationPo = new ActualPopulationPo();

        // 设置实际人口信息
        // 注意：这里保持原字段名，但添加了注释来解释每个字段的赋值逻辑
        actualPopulationPo.setBuilding(actualTenementPO.getBuildingId()); // 设置所属楼宇的ID
        actualPopulationPo.setTenementId(actualTenementPO.getRoomId());   // 注意：这里根据字段名直接设置，但请确保业务逻辑正确
        actualPopulationPo.setApartment(actualTenementPO.getUnitId());    // 设置所属单元的ID（公寓、套房等）
        actualPopulationPo.setPlotId(actualTenementPO.getPlotId());       // 设置所属地块的ID
        // 假设actualTenementPO中确实有一个字段代表人口ID，且适用于actualPopulationPo
        actualPopulationPo.setId(actualTenementPO.getPopulationId());     // 设置人口信息的唯一ID

        // 调用Mapper更新人口信息
        try {
            // 假设Mapper接口中的方法名符合Java命名规范（即方法名以小写字母开头）
            // 但如果实际项目中Mapper方法名是大写开头的，请保持原样
            actualTenementMapper.UpdatePopulation(actualPopulationPo); // 调用Mapper方法更新数据
        } catch (Exception e) {
            // 处理可能出现的异常，例如记录日志、抛出自定义业务异常等
            throw new RuntimeException("更新实际人口信息时发生错误", e);
        }
    }

    @Override
    @Transactional
    public List<ActualTenementVO> all() {
        List<ActualTenementVO> byPlotIdList = actualTenementMapper.findByPlotIdList(null);
        kafkaTemplate.send("Tenement", byPlotIdList);
        return byPlotIdList;
    }

}
